/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ModuloControladorBD;

import ModuloBaseDelConocimiento.Enfermedad;
import ModuloControladorBD.exceptions.IllegalOrphanException;
import ModuloControladorBD.exceptions.NonexistentEntityException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import ModuloBaseDelConocimiento.Caso;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author rayner
 */
public class EnfermedadJpaController {

    public EnfermedadJpaController() {
        emf = Persistence.createEntityManagerFactory("medicalDiagnosisRBC_ANNPU");
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Enfermedad enfermedad) {
        if (enfermedad.getCasoList() == null) {
            enfermedad.setCasoList(new ArrayList<Caso>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            List<Caso> attachedCasoList = new ArrayList<Caso>();
            for (Caso casoListCasoToAttach : enfermedad.getCasoList()) {
                casoListCasoToAttach = em.getReference(casoListCasoToAttach.getClass(), casoListCasoToAttach.getId());
                attachedCasoList.add(casoListCasoToAttach);
            }
            enfermedad.setCasoList(attachedCasoList);
            em.persist(enfermedad);
            for (Caso casoListCaso : enfermedad.getCasoList()) {
                Enfermedad oldEnfermedadOfCasoListCaso = casoListCaso.getEnfermedad();
                casoListCaso.setEnfermedad(enfermedad);
                casoListCaso = em.merge(casoListCaso);
                if (oldEnfermedadOfCasoListCaso != null) {
                    oldEnfermedadOfCasoListCaso.getCasoList().remove(casoListCaso);
                    oldEnfermedadOfCasoListCaso = em.merge(oldEnfermedadOfCasoListCaso);
                }
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Enfermedad enfermedad) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Enfermedad persistentEnfermedad = em.find(Enfermedad.class, enfermedad.getId());
            List<Caso> casoListOld = persistentEnfermedad.getCasoList();
            List<Caso> casoListNew = enfermedad.getCasoList();
            List<String> illegalOrphanMessages = null;
            for (Caso casoListOldCaso : casoListOld) {
                if (!casoListNew.contains(casoListOldCaso)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Caso " + casoListOldCaso + " since its enfermedad field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            List<Caso> attachedCasoListNew = new ArrayList<Caso>();
            for (Caso casoListNewCasoToAttach : casoListNew) {
                casoListNewCasoToAttach = em.getReference(casoListNewCasoToAttach.getClass(), casoListNewCasoToAttach.getId());
                attachedCasoListNew.add(casoListNewCasoToAttach);
            }
            casoListNew = attachedCasoListNew;
            enfermedad.setCasoList(casoListNew);
            enfermedad = em.merge(enfermedad);
            for (Caso casoListNewCaso : casoListNew) {
                if (!casoListOld.contains(casoListNewCaso)) {
                    Enfermedad oldEnfermedadOfCasoListNewCaso = casoListNewCaso.getEnfermedad();
                    casoListNewCaso.setEnfermedad(enfermedad);
                    casoListNewCaso = em.merge(casoListNewCaso);
                    if (oldEnfermedadOfCasoListNewCaso != null && !oldEnfermedadOfCasoListNewCaso.equals(enfermedad)) {
                        oldEnfermedadOfCasoListNewCaso.getCasoList().remove(casoListNewCaso);
                        oldEnfermedadOfCasoListNewCaso = em.merge(oldEnfermedadOfCasoListNewCaso);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = enfermedad.getId();
                if (findEnfermedad(id) == null) {
                    throw new NonexistentEntityException("The enfermedad with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Enfermedad enfermedad;
            try {
                enfermedad = em.getReference(Enfermedad.class, id);
                enfermedad.getId();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The enfermedad with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            List<Caso> casoListOrphanCheck = enfermedad.getCasoList();
            for (Caso casoListOrphanCheckCaso : casoListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Enfermedad (" + enfermedad + ") cannot be destroyed since the Caso " + casoListOrphanCheckCaso + " in its casoList field has a non-nullable enfermedad field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            em.remove(enfermedad);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Enfermedad> findEnfermedadEntities() {
        return findEnfermedadEntities(true, -1, -1);
    }

    public List<Enfermedad> findEnfermedadEntities(int maxResults, int firstResult) {
        return findEnfermedadEntities(false, maxResults, firstResult);
    }

    private List<Enfermedad> findEnfermedadEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Enfermedad.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Enfermedad findEnfermedad(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Enfermedad.class, id);
        } finally {
            em.close();
        }
    }

    public int getEnfermedadCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Enfermedad> rt = cq.from(Enfermedad.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

}
